package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.ApiKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * API密钥Mapper接口
 * 
 * @author uniflow
 * @since 1.0.0
 */
@Mapper
public interface ApiKeyMapper extends BaseMapper<ApiKey> {
    
    /**
     * 分页查询API密钥
     */
    IPage<ApiKey> selectKeyPage(Page<ApiKey> page,
                               @Param("appId") String appId,
                               @Param("accessKey") String accessKey,
                               @Param("expired") Boolean expired);
    
    /**
     * 根据访问密钥查询
     */
    ApiKey selectByAccessKey(@Param("accessKey") String accessKey);
    
    /**
     * 根据应用ID查询密钥列表
     */
    List<ApiKey> selectByAppId(@Param("appId") String appId);
    
    /**
     * 检查访问密钥是否存在
     */
    boolean existsByAccessKey(@Param("accessKey") String accessKey, @Param("excludeId") String excludeId);
    
    /**
     * 查询有效的密钥
     */
    List<ApiKey> selectValidKeys(@Param("appId") String appId);
    
    /**
     * 查询过期的密钥
     */
    List<ApiKey> selectExpiredKeys();
    
    /**
     * 查询即将过期的密钥
     */
    List<ApiKey> selectExpiringKeys(@Param("days") Integer days);
    
    /**
     * 批量删除过期密钥
     */
    int deleteExpiredKeys();
    
    /**
     * 更新密钥过期时间
     */
    int updateExpiresAt(@Param("id") String id, @Param("expiresAt") LocalDateTime expiresAt);
    
    /**
     * 更新密钥权限
     */
    int updatePermissions(@Param("id") String id, @Param("permissions") String permissions);
    
    /**
     * 查询密钥总数
     */
    Long selectTotalCount();
    
    /**
     * 查询有效密钥数
     */
    Long selectValidCount();
    
    /**
     * 查询过期密钥数
     */
    Long selectExpiredCount();
    
    /**
     * 查询今日新增密钥数
     */
    Long selectTodayNewCount();
    
    /**
     * 查询密钥使用统计
     */
    List<Map<String, Object>> selectUsageStats(@Param("keyId") String keyId,
                                               @Param("startDate") String startDate,
                                               @Param("endDate") String endDate);
    
    /**
     * 查询密钥调用频率统计
     */
    List<Map<String, Object>> selectCallFrequencyStats();
    
    /**
     * 查询密钥权限分布
     */
    List<Map<String, Object>> selectPermissionDistribution();
    
    /**
     * 查询密钥生命周期统计
     */
    List<Map<String, Object>> selectLifecycleStats();
    
    /**
     * 查询最近活跃的密钥
     */
    List<ApiKey> selectRecentActiveKeys(@Param("limit") Integer limit);
    
    /**
     * 查询长时间未使用的密钥
     */
    List<ApiKey> selectInactiveKeys(@Param("days") Integer days);
    
    /**
     * 查询高频使用的密钥
     */
    List<ApiKey> selectHighFrequencyKeys(@Param("limit") Integer limit);
    
    /**
     * 查询密钥详情（包含应用信息）
     */
    ApiKey selectWithApplication(@Param("id") String id);
    
    /**
     * 查询密钥安全统计
     */
    Map<String, Object> selectSecurityStats(@Param("keyId") String keyId);
    
    /**
     * 查询密钥错误统计
     */
    List<Map<String, Object>> selectErrorStats(@Param("keyId") String keyId);
    
    /**
     * 查询密钥性能统计
     */
    Map<String, Object> selectPerformanceStats(@Param("keyId") String keyId);
    
    /**
     * 查询密钥IP访问统计
     */
    List<Map<String, Object>> selectIpAccessStats(@Param("keyId") String keyId);
    
    /**
     * 查询密钥时段访问统计
     */
    List<Map<String, Object>> selectHourlyAccessStats(@Param("keyId") String keyId);
    
    /**
     * 查询密钥月度统计
     */
    List<Map<String, Object>> selectMonthlyStats(@Param("keyId") String keyId, @Param("months") Integer months);
    
    /**
     * 验证密钥和应用的关联关系
     */
    boolean validateKeyAppRelation(@Param("accessKey") String accessKey, @Param("appId") String appId);
    
    /**
     * 查询密钥的权限列表
     */
    List<String> selectKeyPermissions(@Param("accessKey") String accessKey);
    
    /**
     * 检查密钥是否有指定权限
     */
    boolean hasPermission(@Param("accessKey") String accessKey, @Param("permission") String permission);
}